package cn.gok.jdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: chenfan
 * @Description:  Jdk动态代理实现
 */
public class JdkProxyLog implements InvocationHandler {

    //委托类的对象
    private Object obj;

    public JdkProxyLog(Object obj){
        this.obj = obj;
    }


    /**
     * 我们在invoke方法中书写增强业务逻辑，
     * 并且通过参数method 去调用原始委托类的方法
     *
     * @param proxy
     * @param method
     * @param args   方法参数
     * @return       委托类的原始方法执行后，返回的结果
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("功能增强，开始日志记录....");

        //执行委托类的原始方法
        Object result = method.invoke(obj, args);

        //将执行的结果返回
        return result;
    }

    /**
     * 调用当前方法，返回一个动态代理类的对象
     *      在方法的内部通过调用Proxy 提供的 静态方法newProxyInstance来获取此动态代理对象
     */
    public Object getProxyObject(){
        /*
            newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
                    loader :         类加载器
                    interfaces：     委托类的 接口类型  的数组
                    h :              处理器对象
         */
        Object proxyObject = Proxy.newProxyInstance(
                JdkProxyLog.class.getClassLoader(),
                obj.getClass().getInterfaces(),
                this );

        return proxyObject;
    }
}
